/*
 * RegistroCanciones.cpp
 *
 *  Created on: 14/04/2013
 *      Author: pato
 */

#include "RegistroCanciones.h"

RegistroCanciones::RegistroCanciones() {
	//Constructor por defecto, se inicializa en la misma carpeta
	this->archivo = new ArchivoRV();
	string rutaHash = PATH_HASH_AUXILIAR;
	this->indicePrimario = new HashExtensible(rutaHash, "unsigned int", MB1);


}

RegistroCanciones::RegistroCanciones(string path) {
	//Constructor con parametro
	string rutaRV = path;
	rutaRV += PATH_ARCHIVO_RV;
	this->archivo = new ArchivoRV(rutaRV);
	string rutaHash = path;
	rutaHash += PATH_HASH_AUXILIAR;
	this->indicePrimario = new HashExtensible(rutaHash, "unsigned int", MB1*4);

}

int RegistroCanciones::Borrar(unsigned int id) {
	list<unsigned int>* lista_offset = this->indicePrimario->BuscarClave(id);
	if (!lista_offset) {
		return -1;
	}
	std::list<unsigned int>::const_iterator it;
	it = lista_offset->begin();
	unsigned int offset = (unsigned int) *it;
	this->archivo->Borrar(offset);
	this->indicePrimario->baja(id);
	if (lista_offset) {
		delete lista_offset;
	}
	return 0;
}

RegistroCanciones::~RegistroCanciones() {
	delete this->archivo;
	delete this->indicePrimario;
}

unsigned int RegistroCanciones::Agregar(string cancion) {
	unsigned int id = 0;
	unsigned int offset = 1;
	PPMC* compresor = new PPMC();
	int largo_compresion = 0;
	char *compresion;
	char *buffer = (char*) malloc(MB1);
	strcpy(buffer,cancion.c_str());
	compresor->comprimirBuffer(buffer,cancion.size(),&compresion,&largo_compresion);
	delete compresor;
	offset = this->archivo->Escribir(largo_compresion, compresion);
	//Guardar el offset en el hash(indice primario)
	id = this->indicePrimario->Agregar(offset);
	return id;
}

string* RegistroCanciones::Buscar(unsigned int id) {
	unsigned int offset = 1;
	string* cancion = NULL;
	//MIrar en el Hash a ver que offset tiene ese id.
	list<unsigned int>* lista_offset =  this->indicePrimario->BuscarClave(id);
	if (lista_offset) {
		char* c_cancion = (char*) malloc (MB1);
		char* c_cancion_des = 0;
		int largo2 = 0;
		strcpy(c_cancion,"");
		list<unsigned int>::const_iterator it;
		it = lista_offset->begin();
		offset = (unsigned int) *it;
		int largo_compresion = this->archivo->Leer(offset,c_cancion);
		PPMC* compresor2 = new PPMC();
		compresor2->descomprimirBuffer(c_cancion,largo_compresion,&c_cancion_des,&largo2);
		delete compresor2;
		cancion = new string(c_cancion_des);
		free(c_cancion);
		delete lista_offset;
		free(c_cancion_des);
	}
	return cancion;
}
